//package com;
//
//import com.alibaba.fastjson.JSON;
//import org.apache.commons.codec.binary.Base64;
//import org.apache.commons.codec.digest.DigestUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.http.HttpEntity;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
//import org.apache.http.client.methods.CloseableHttpResponse;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.message.BasicNameValuePair;
//import org.apache.http.util.EntityUtils;
//import org.bouncycastle.jce.provider.BouncyCastleProvider;
//
//import javax.crypto.Cipher;
//import javax.crypto.spec.SecretKeySpec;
//import java.io.IOException;
//import java.net.URI;
//import java.nio.charset.Charset;
//import java.security.Security;
//import java.util.*;
//
///**
// *加解密和签名工具类
// * @author admin
// *
// */
//public class APIToolUtils {
//
//
//	  /**
//	   * 默认128位加密
//	   */
//	  private static final int KEY_BIT_SIZE = 128;
//
//	  /**
//	   * 密匙分段长度
//	   */
//	  private static final int BIT_SIZE = 8;
//
//	  /**
//	   * 编码
//	   */
//	  private static final Charset CHAR_SET = Charset.forName("utf-8");
//
//	  /**
//	   *  AES，简单分组，填充7
//	   */
//	  private static final String ALGORITHM = "AES/ECB/PKCS7Padding";
//
//	  static {
//	      Security.addProvider(new BouncyCastleProvider());
//	  }
//
//	  /**
//	   * 加密字符串。
//	   *
//	   * @param target 原始字符串
//	   * @param key    密钥字符串
//	   * @return 加密结果字符串
//	   */
//	  public static String encrypt(String target, String key) {
//	      try {
//	          Cipher cipher = Cipher.getInstance(ALGORITHM);
//	          cipher.init(Cipher.ENCRYPT_MODE, initKey(key));
//	          byte[] encryptResult = cipher.doFinal(target.getBytes(CHAR_SET));
//	          //兼容安卓环境的1.2codec
//	          String unsafeStr = new String(Base64.encodeBase64(encryptResult, false), CHAR_SET);
//	          return unsafeStr.replace('+', '-').replace('/', '_');
//	      } catch (Exception e) {
//	          throw new RuntimeException("敏感数据加密错误", e);
//	      }
//	  }
//
//	  /**
//	   * 解密字符串。
//	   *
//	   * @param target 加密结果字符串
//	   * @param key    密钥字符串
//	   * @return 原始字符串
//	   */
//	  public static String decrypt(String target, String key) {
//	      try {
//	          Cipher cipher = Cipher.getInstance(ALGORITHM);
//	          cipher.init(Cipher.DECRYPT_MODE, initKey(key));
//	          String unsafeStr = target.replace('-', '+').replace('_', '/');
//	          byte[] decryptResult = cipher.doFinal(Base64.decodeBase64(unsafeStr.getBytes(CHAR_SET)));
//	          return new String(decryptResult, CHAR_SET);
//	      } catch (Exception e) {
//	          throw new RuntimeException("敏感数据解密错误", e);
//	      }
//	  }
//
//	  /**
//	   * 生成密钥字节数组，原始密钥字符串不足128位，补填0.
//	   *
//	   * @param originalKey 原始密钥
//	   * @return 加密
//	   */
//	  private static SecretKeySpec initKey(String originalKey) {
//	      byte[] keys = originalKey.getBytes(CHAR_SET);
//
//	      byte[] bytes = new byte[KEY_BIT_SIZE / BIT_SIZE];
//	      for (int i = 0; i < bytes.length; i++) {
//	          if (keys.length > i) {
//	              bytes[i] = keys[i];
//	          } else {
//	              bytes[i] = 0;
//	          }
//	      }
//
//	      return new SecretKeySpec(bytes, "AES");
//	  }
//
//
//	  /**
//	   * aid
//	   */
//	  public static final String API_KEY = "aid";
//
//	  /**
//	   * form 参数名sign
//	   */
//	  public static final String SIGN_KEY = "sign";
//
//
//	  /**
//	   * 计算签名串
//	   * @param signMap 参数map
//	   * @return 签名
//	   */
//	  public static String getSignStr(SortedMap<String, String> signMap) {
//	      StringBuilder sb = new StringBuilder();
//	      Iterator<String> iterator = signMap.keySet().iterator();
//	      while (iterator.hasNext()) {
//	          String key = iterator.next();
//	          if (StringUtils.isNotEmpty(signMap.get(key))
//	                  && !key.equals(SIGN_KEY) && !key.equals(API_KEY)) {
//	              String value = signMap.get(key);
//	              sb.append(key).append("=").append(value).append(";");
//	          }
//	      }
//	      return sb.substring(0, sb.length() - 1);
//	  }
//
//	  /**
//	   * 截取块大小
//	   */
//	  private static final  int BLOCK_LEN = 4;
//
//
//	  /**
//	   * md5签名
//	   * @param targetStr 明文
//	   * @return 密文
//	   */
//	  public static String doMD5Sign(String targetStr) {
//	  	try {
//			byte[] md5Result = DigestUtils.md5(targetStr.getBytes("utf-8"));
//			if (md5Result.length != BLOCK_LEN*4) {
//				throw new IllegalArgumentException("MD5加密结果字节数组错误");
//			}
//			Integer first = Math.abs(bytesToInt(md5Result, BLOCK_LEN*0));
//			Integer second = Math.abs(bytesToInt(md5Result, BLOCK_LEN*1));
//			Integer third = Math.abs(bytesToInt(md5Result, BLOCK_LEN*2));
//			Integer fourth = Math.abs(bytesToInt(md5Result, BLOCK_LEN*3));
//			return first.toString() + second.toString() + third.toString() + fourth.toString();
//		}catch (Exception ex){
//	  		ex.printStackTrace();
//		}
//		  return null;
//
//
//	  }
//
//	  /**
//	   * 与或常量
//	   */
//	  private static  final int OX_FF =  0xFF;
//	  /**
//	   * 1bit
//	   */
//	  private static final  int BIT = 8;
//	  /**
//	   * 高位前，低位后，字节数组转INT
//	   *
//	   * @param src 源字符
//	   * @param offset 偏移量
//	   * @return 结果
//	   */
//	  private static int bytesToInt(byte[] src, int offset) {
//	      int value;
//	      value = (int) (((src[offset] & OX_FF) << 3*BIT)
//	              | ((src[offset + 1] & OX_FF) << 2*BIT)
//	              | ((src[offset + 2] & OX_FF) << BIT)
//	              | (src[offset + 3] & OX_FF));
//	      return value;
//	  }
//
//	  /**
//	     *  向指定 URL 发送POST方法的请求
//	     *
//	     * @param url   发送请求的 URL
//	     * @param param 请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
//	     * @return 所代表远程资源的响应结果
//	     * @throws IOException 网络错误
//	     */
//	  @SuppressWarnings("rawtypes")
//	public static String sendPost(String url, Map<String, String> param) throws IOException {
//	        CloseableHttpClient client = HttpClients.createDefault();
//	        HttpPost postMethod = new HttpPost();
//	        postMethod.setURI(URI.create(url));
//
//	        if (param != null && param.size() > 0) {
//	            List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
//
//	            for (Map.Entry en : param.entrySet()) {
//	                parameters.add(new BasicNameValuePair(en.getKey().toString(), en.getValue().toString()));
//	            }
//	            postMethod.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
//	        }
//	        CloseableHttpResponse resp = client.execute(postMethod);
//	        HttpEntity ent = resp.getEntity();
//	        String result = EntityUtils.toString(ent, "UTF-8");
//
//	        return result;
//	  }
//
//	  public static void main(String[] args){
//
////		  String.format("%03d%03d", 510 ,100)
//		  String api_key = "TGjFDkKm6SYxFjWXmuYI";
//		  TreeMap<String, String> params = new TreeMap<String, String>();
//		  params.put("uid", "");
//		  params.put("cid", String.format("%03d%03d", 510 ,100));
//		  Map<String, Object> param = new HashMap<String, Object>();
//		  param.put("accountCode", "PC1811200008");
//		  param.put("accountSecretkey", "d1tiyuI2y");
//		  param.put("couponBatchNo", "EA201811220001");
//		  param.put("mobile", "15080453418");
//		  param.put("couponSize", 1);
//		  param.put("type", 1);
//		  String q =  JSON.toJSONString(param);
//		  q = encrypt(q, api_key);
//		  params.put("q", q);
//		  String sign = doMD5Sign(getSignStr(params) + api_key);
//		  params.put("sign", sign);
//		  System.out.println(sign);
//		  String api_url = "http://eapitest02.luckincoffee.com/resource/e/external/couponsend?";
//		  String url = api_url + "cid=510100";
//		  url = url + "&q=" + q;
//		  url = url + "&sign=" + sign;
//		  System.out.println(url);
//
//		  try {
//			String result = sendPost(api_url, params);
//			System.out.println(decrypt(result, api_key));
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	  }
//
//
//
//}
//
